package com.leech.jcrop.util;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.DecimalFormat;

import javax.imageio.ImageIO;

/**
 * 图像处理工具类（本类完全可以使用，但是更加推荐ImageMagick +Jmagick，采用C++实现的一个类库，提供了Java的Api，非常强大和高效）
 * 而且要为JVM分配较大的堆内存，否则内存溢出
 * @author <a href="http://www.xdemo.org/">http://www.xdemo.org/</a>
 * 252878950@qq.com
 */
public class ImageUtils {

	/**
	 * 缩放图片
	 * @param src 源文件
	 * @param dest 目标文件
	 * @param ratio 缩放比例，如 0.1,0.8,1.2,2.4
	 * @throws IOException 
	 */
	public static void zoom(String src,String dest,double ratio) throws IOException{
		//获取文件扩展名
		String suffix=src.substring(src.lastIndexOf(".")+1);
		//读入文件
		BufferedImage bi=ImageIO.read(new File(src));
		//计算目标文件宽度
		int targetWidth=Integer.parseInt(new DecimalFormat("0").format(bi.getWidth()*ratio));
		//计算目标文件高度
		int targetHeight=Integer.parseInt(new DecimalFormat("0").format(bi.getHeight()*ratio));
		//获取BufferedImage读入的图片的一个缩放的版本
		Image image=bi.getScaledInstance(targetWidth,targetHeight,Image.SCALE_DEFAULT);
		//创建一张空白的缓存图片
		BufferedImage target=new BufferedImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_RGB);
		//返回一张2D图像
		Graphics g=target.createGraphics();
		//将BufferedImage读入的图片画到上一步创建的对象上
		g.drawImage(image, 0, 0, null);
		//释放
		g.dispose();
		//图像写入文件
		ImageIO.write(target, suffix, new File(dest));
	}
	
	/**
	 * 切图
	 * @param src 源文件
	 * @param dest 目标文件
	 * @param startX 起点x坐标
	 * @param startY 起点y坐标
	 * @param endX 结束点x坐标
	 * @param endY 结束点y坐标
	 * @throws IOException
	 */
	public static void cut(String src,String dest,int startX,int startY,int endX,int endY) throws IOException{
		//获取文件扩展名
		String suffix=src.substring(src.lastIndexOf(".")+1);
		//读入文件
		BufferedImage bi=ImageIO.read(new File(src));
		//计算宽度
		int width=Math.abs(startX-endX);
		//计算高度
		int height=Math.abs(startY-endY);
		BufferedImage target= bi.getSubimage(startX, startY, width, height);
		ImageIO.write(target, suffix, new File(dest));
	}

}
